package com.ruoyi.aitcommon.service.impl;

import java.util.List;
import java.util.Map;

import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.utils.DateUtils;

import cn.hutool.core.util.StrUtil;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.aitcommon.mapper.AitEntityInfoMapper;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.aitcommon.domain.AitEntityInfo;
import com.ruoyi.aitcommon.service.IAitEntityInfoService;
import com.ruoyi.aitcommon.utils.AITConst;
import com.ruoyi.aitcommon.utils.AITException;
import com.ruoyi.aitcommon.utils.EntityCache;
import com.ruoyi.aitcommon.utils.FlowParamUtils;
import com.ruoyi.aitcommon.utils.FlowUtils;
import com.ruoyi.aitcommon.utils.LogUtils;

/**
 * 接口实体记录Service业务层处理
 * 
 * @author cli
 * @date 2021-09-14
 */
@Service
public class AitEntityInfoServiceImpl implements IAitEntityInfoService {
	@Autowired
	EntityCache entityCache;
	@Autowired
	private AitEntityInfoMapper aitEntityInfoMapper;

	/**
	 * 查询接口实体记录
	 * 
	 * @param id 接口实体记录ID
	 * @return 接口实体记录
	 */
	@Override
	public AitEntityInfo selectAitEntityInfoById(Long id) {
		return aitEntityInfoMapper.selectAitEntityInfoById(id);
	}

	/**
	 * 查询接口实体记录列表
	 * 
	 * @param aitEntityInfo 接口实体记录
	 * @return 接口实体记录
	 */
	@Override
	public List<AitEntityInfo> selectAitEntityInfoList(AitEntityInfo aitEntityInfo) {
		List<AitEntityInfo> list = aitEntityInfoMapper.selectAitEntityInfoList(aitEntityInfo);
		return list;
	}

	/**
	 * 新增接口实体记录
	 * 
	 * @param entityInfo 接口实体记录
	 * @return 结果
	 */
	@Override
	public int insertAitEntityInfo(AitEntityInfo entityInfo) {
//		字段长度设置
		entityInfo.setDataJson(StringUtils.substring(entityInfo.getDataJson(), 0, AITConst.BIGSTRINGSIZE));
		entityInfo.setSuccessJson(StringUtils.substring(entityInfo.getSuccessJson(), 0, AITConst.BIGSTRINGSIZE));
		entityInfo.setRetMsg(StringUtils.substring(entityInfo.getRetMsg(), 0, AITConst.BIGSTRINGSIZE));

		entityInfo.setField0(StringUtils.substring(entityInfo.getField0(), 0, AITConst.STRINGSIZE));
		entityInfo.setField1(StringUtils.substring(entityInfo.getField1(), 0, AITConst.STRINGSIZE));
		entityInfo.setField2(StringUtils.substring(entityInfo.getField2(), 0, AITConst.STRINGSIZE));
		entityInfo.setField3(StringUtils.substring(entityInfo.getField3(), 0, AITConst.STRINGSIZE));
		entityInfo.setField4(StringUtils.substring(entityInfo.getField4(), 0, AITConst.STRINGSIZE));
		entityInfo.setField5(StringUtils.substring(entityInfo.getField5(), 0, AITConst.STRINGSIZE));
		entityInfo.setField6(StringUtils.substring(entityInfo.getField6(), 0, AITConst.STRINGSIZE));
		entityInfo.setField7(StringUtils.substring(entityInfo.getField7(), 0, AITConst.STRINGSIZE));
		entityInfo.setField8(StringUtils.substring(entityInfo.getField8(), 0, AITConst.STRINGSIZE));
		entityInfo.setField9(StringUtils.substring(entityInfo.getField9(), 0, AITConst.STRINGSIZE));
		
//		设置默认值
		entityInfo.setCreateTime(DateUtils.getNowDate());
		
		return aitEntityInfoMapper.insertAitEntityInfo(entityInfo);
	}

	@Override
	public int insertAitEntityInfo(Map<String, Object> entityMap, Map<String, Object> data, Exception ex) throws Exception {
		if(ex==null) {
			return insertAitEntityInfo(entityMap,data,null,null,HttpStatus.SUCCESS,"");
		}else {
//			文件错误日志
			LogUtils.error(ex.getMessage(),ex);
			
//			实体信息记录
			int retCode =HttpStatus.ERROR;
			if (ex instanceof AITException) {
				AITException ex1=(AITException)ex;
				if (ex1.getErrCode() == HttpStatus.ERROR_Repeat) {
//					插入错误码599
					retCode = HttpStatus.ERROR_Repeat;
				}
			}
			return insertAitEntityInfo(entityMap, data, null, null, retCode, ex.getMessage());
		}
	}
	
	/**
	 * 新增接口实体记录
	 * 
	 * @param entityMap 实体map
	 * @param data      相关数据,用于翻译实体map中的变量${}
	 * @param successMap 成功数据映射
	 * @param successData 成功返回的数据
	 * @param retCode 返回码
	 * @param retMsg 返回消息
	 * @return 插入个数
	 */
	@Override
	public int insertAitEntityInfo(Map<String, Object> entityMap, Map<String, Object> data
			,Map<String,Object> successMap,Map<String,Object> successData
			,int retCode, String retMsg)
			throws Exception {
		if (entityMap == null || data == null)
			return 0;
		
//		构造entityMap的数据
		Map<String, Object> transMap = FlowParamUtils.getFlowParamsValue(entityMap, data);
//		构造successMap的数据
		if(successMap!=null&&successData!=null) {
			Map<String,Object> successMap1=FlowParamUtils.getFlowParamsValue(successMap, successData);
//			将successMap1合并至transMap
			if(successMap1!=null) {
				for(String key:successMap1.keySet()) {
					transMap.put(key, successMap1.get(key));
				}
			}
		}
//		构造entityInfo实体
		JSONObject transJson = new JSONObject(transMap);
		AitEntityInfo entityInfo = transJson.toJavaObject(AitEntityInfo.class);
//		设置dataJson
		JSONObject dataJson=new JSONObject(data);
		entityInfo.setDataJson(JSONObject.toJSONStringWithDateFormat(dataJson, "yyyy-MM-dd HH:mm:ss"));
		if(successData!=null) {
			JSONObject successJson=new JSONObject(successData);
			entityInfo.setSuccessJson(JSONObject.toJSONStringWithDateFormat(successJson, "yyyy-MM-dd HH:mm:ss"));
		}
//		设置FLow信息
		entityInfo.setFlowId(FlowUtils.getFlowID());
		entityInfo.setFlowCode(FlowUtils.getFlowCode());
		entityInfo.setFlowName(FlowUtils.getFlowName());
//		设置成功/失败信息
		entityInfo.setRetCode(String.valueOf(retCode));
		if(!StrUtil.isBlankIfStr(retMsg))
			entityInfo.setRetMsg(retMsg);
		
		if (retCode>=200&&retCode<300) {
//			对于成功记录,插入缓存
			entityCache.setEntityCache(entityMap, dataJson);
			FlowUtils.addSuccessCnt();
		} else if(retCode==HttpStatus.ERROR_Repeat) {
//			重复记录,更新缓存
			entityCache.setEntityCache(entityMap, dataJson);
			FlowUtils.addErrorCnt();
		}
		else {
			FlowUtils.addErrorCnt();
		}

		return insertAitEntityInfo(entityInfo);
	}

	/**
	 * 修改接口实体记录
	 * 
	 * @param aitEntityInfo 接口实体记录
	 * @return 结果
	 */
	@Override
	public int updateAitEntityInfo(AitEntityInfo aitEntityInfo) {
		aitEntityInfo.setUpdateTime(DateUtils.getNowDate());
		return aitEntityInfoMapper.updateAitEntityInfo(aitEntityInfo);
	}

	/**
	 * 批量删除接口实体记录
	 * 
	 * @param ids 需要删除的接口实体记录ID
	 * @return 结果
	 */
	@Override
	public int deleteAitEntityInfoByIds(Long[] ids) {
		return aitEntityInfoMapper.deleteAitEntityInfoByIds(ids);
	}

	/**
	 * 删除接口实体记录信息
	 * 
	 * @param id 接口实体记录ID
	 * @return 结果
	 */
	@Override
	public int deleteAitEntityInfoById(Long id) {
		return aitEntityInfoMapper.deleteAitEntityInfoById(id);
	}



}
